package E_2024;

import java.util.*;

/*
题目描述
    在一个纸筒中有若干个纸片，每个纸片上都记录了一个英文小写字母。

    班级一共有 N 个学生，每个学生都要去纸筒中抓一把纸片。当学生抓完纸片后，需要各自将手中纸片按照字母表顺序升序，并组成字母串。

    老师需要统计这些字母串，并排序。优先按照相同字母串出现次数升序，若存在出现相同次数的字母串，则按照字母串长度降序排列，若两个字母串出现次数和长度都一样，则按照字典序降序。

    请输出排序后的所有字母串。

输入描述
    第一行输入一个正整数 N，表示学生数量。N 不大于 10000。

    之后 N 行输入每个学生抓到的一把纸片（无序）。假设每个学生最大抓到 10 个纸片。

输出描述
    请输出排序后的字母串，每个字母串输出一行。

用例
    输入	5
    aab
    aba
    abc
    aad
    daa
    输出	abc
    aad
 */
public class E_100_37 {
    public static void main(String[] args) {
        List<Character[]> list = new ArrayList<>();
        list.add(new Character[]{'a','a','b'});
        list.add(new Character[]{'a','b','a'});
        list.add(new Character[]{'a','b','c'});
        list.add(new Character[]{'a','a','d','d'});
        list.add(new Character[]{'d','d','a','a'});
        ans(list);
    }
    public static void ans(List<Character[]> arr){
        Map<String,Integer> temp = new HashMap<>();
        for (Character[] ch : arr) {
            Arrays.sort(ch);
            String str = Arrays.toString(ch);
            temp.put(str, temp.getOrDefault(str, 0) + 1);
        }
        String[][] ans = new String[temp.size()][2];
        int i = 0;
        for (Map.Entry<String, Integer> entry : temp.entrySet()) {
            ans[i][0] = entry.getKey();
            ans[i++][1] = String.valueOf(entry.getValue());
        }
        Arrays.sort(ans,(a,b) -> {
            if (!Objects.equals(a[1], b[1])) return Integer.parseInt(a[1]) - Integer.parseInt(b[1]);
            else if (a[0].length() != b[0].length()) return b[0].length() - a[0].length();
            else return b[0].compareTo(a[0]);
        });
        for (String[] an : ans) {
            System.out.println(an[0]);
        }
    }
}
